import router from '@/router'
import { ElMessage } from 'element-plus'
import moment from 'moment'

import { useI18n } from 'vue-i18n'
import type { SupportedLocales } from '@/locales/i18n'
import type { MessageSchema } from '@/types/i18n'

export function goPage(path: string, params?: any, query?: any) {
    if (params) {
        router.push({
            name: path,
            params: params ? params : {},
        })

        return
    }

    if (params) {
        router.push({
            name: path,
            query: query ? query : {},
        })

        return
    }

    router.push(path)
}

export function apiMsgProp(code: number, msg: string = '') {
    if (code === 200) {
        ElMessage({
            message: msg,
            type: 'success',
        })
    } else {
        ElMessage({
            message: msg,
            type: 'error',
        })
    }
}

/**
 * @function getTimeDifferenceInSeconds 计算当前时间与目标时间的时间差（秒），可选择添加提前偏移量
 * @param targetTime 目标时间，可以是Date对象或能被Date解析的字符串
 * @param offsetInSeconds 提前的偏移量（秒），如果提供则从目标时间中减去
 * @returns 时间差（秒），正数表示目标时间在未来，负数表示已过去
 */
export function getTimeDifferenceInSeconds(targetTime: Date | string, offsetInSeconds?: number): number {
    const now = new Date().getTime()
    let target = typeof targetTime === 'string' ? new Date(targetTime).getTime() : targetTime.getTime()

    // 如果提供了偏移量，则从目标时间中减去偏移量
    if (offsetInSeconds !== undefined) {
        target -= offsetInSeconds * 1000
    }

    const differenceInSeconds = target - now

    return differenceInSeconds
}

/**
 * @function isTimeExpired 检查当前时间是否已经超过目标时间
 * @param targetTime 目标时间，可以是Date对象或能被Date解析的字符串
 * @returns 如果当前时间超过目标时间返回true，否则返回false
 * @throws 如果目标时间无法解析则抛出错误
 */
export function isTimeExpired(targetTime: Date | string): boolean {
    const target = typeof targetTime === 'string' ? new Date(targetTime) : targetTime
    if (isNaN(target.getTime())) {
        throw new Error('Invalid target time provided')
    }
    const now = new Date()

    return now > target
}

/**
 * @function formatTime 全局时间格式化
 * @param time 目标时间，可以是Date对象或能被Date解析的字符串
 * @returns 根据语种返回当前
 */
export function formatLoginTime(time: string | Date) {
    const { locale } = useI18n<{ message: MessageSchema }, SupportedLocales>()
    switch (locale.value) {
        case 'zh-hk': {
            return moment(time).locale('zh-hk').format('YYYY年 MM月 DD日(ddd) HH:mm')
        }
        case 'zh-cn': {
            return moment(time).locale('zh-cn').format('YYYY年 MM月 DD日(ddd) HH:mm')
        }
        case 'en': {
            return moment(time).locale('en').format('dddd, D MMMM YYYY, h:mm A')
        }
    }
}
/**
 * @function formatTime 全局时间格式化
 * @param time 目标时间，可以是Date对象或能被Date解析的字符串
 * @returns 根据语种返回当前
 */
export function formatTime(time: string | Date) {
    
    const { locale } = useI18n<{ message: MessageSchema }, SupportedLocales>()
    switch (locale.value) {
        case 'zh-hk': {
            return moment.unix(time).locale('zh-hk').format('YYYY/MM/DD')
            
        }
        case 'zh-cn': {
            return moment.unix(time).locale('zh-cn').format('YYYY/MM/DD')
        }
        case 'en': {
            return moment.unix(time).locale('en').format('YYYY/MM/DD')
        }
    }
}
/**
 * @function formatTime 全局时间格式化
 * @param time 目标时间，可以是Date对象或能被Date解析的字符串
 * @returns 根据语种返回当前
 */
export function formatOnlyTime(time: string | Date) {
    const { locale } = useI18n<{ message: MessageSchema }, SupportedLocales>()
    switch (locale.value) {
        case 'zh-hk': {
            return moment(time).locale('zh-hk').format('HH:mm')
        }
        case 'zh-cn': {
            return moment(time).locale('zh-cn').format('HH:mm')
        }
        case 'en': {
            return moment(time).locale('en').format('HH:mm')
        }
    }
}

/**
 * @function createDownloadA 创建下载链接
 * @param link 链接
 * @param name 文件名
 */
export function createDownloadA(link: string, name: string) {
    const a = document.createElement('a')
    a.href = link
    a.download = name

    document.body.appendChild(a)
    a.click()
    document.body.removeChild(a)
}

/**
 * @function downloadCSV 下载CVS文件
 * @param link 链接
 * @param name 文件名
 */
export function downloadCSV(csvData: any, filename: string) {
    // 创建Blob对象
    const blob = new Blob([csvData], { type: 'text/csv;charset=utf-8;' })

    // 创建下载链接
    const link = document.createElement('a')
    const url = URL.createObjectURL(blob)

    link.setAttribute('href', url)
    link.setAttribute('download', filename)
    link.style.visibility = 'hidden'

    document.body.appendChild(link)
    link.click()
    document.body.removeChild(link)

    // 释放URL对象
    setTimeout(() => {
        URL.revokeObjectURL(url)
    }, 100)
}
